package wn.tcpip.socket.netty.model;

import com.alibaba.fastjson.annotation.JSONField;
import io.netty.channel.Channel;

import java.io.Serializable;

public class GPSBackRequest implements Serializable {
	private static final long serialVersionUID = -191809910510629700L;

	/** 起始位 */
	private String xinxiTou;

	/** 长度 */
	private int length;

	/** 协议号 */
	private String xieyiHao;

	/** 信息内容 */
	private String content;

	/** 信息序列号 */
	private int xulieHao;

	/** 错误校验 */
	private String crc;

	/** 结束位 */
	private String end;

	/** 原始数据 */
	private String originalData;

	/** 用户id */
	protected String userID;

	/** 用户名 */
	protected String userName;

	/** imei号 */
	private String imei;

	/** 指令流水号 */
	private long cmdSerialNo;
	@JSONField(serialize=false)
	private Channel channel;

	public Channel getChannel() {
		return channel;
	}

	public void setChannel(Channel channel) {
		this.channel = channel;
	}

	/**
	 * 设定imei号
	 *
	 * @param argImei
	 *            imei号
	 */
	public void setImei(String argImei) {
		this.imei = argImei;
	}

	/**
	 * 取得imei号
	 *
	 * @return imei号
	 */
	public String getImei() {
		return imei;
	}

	/**
	 * 设定用户id
	 *
	 * @param argUserID
	 *            用户id
	 */
	public void setUserID(String argUserID) {
		this.userID = argUserID;
	}

	/**
	 * 取得用户id
	 *
	 * @return 用户id
	 */
	public String getUserID() {
		return userID;
	}

	/**
	 * 设定用户名
	 *
	 * @param argUserName
	 *            用户名
	 */
	public void setUserName(String argUserName) {
		this.userName = argUserName;
	}

	/**
	 * 取得用户名
	 *
	 * @return 用户名
	 */
	public String getUserName() {
		return userName;
	}

	/**
	 * 设定起始位
	 *
	 * @param argXinxiTou
	 *            起始位
	 */
	public void setXinxiTou(String argXinxiTou) {
		this.xinxiTou = argXinxiTou;
	}

	/**
	 * 取得起始位
	 *
	 * @return 起始位
	 */
	public String getXinxiTou() {
		return xinxiTou;
	}

	/**
	 * 设定长度
	 *
	 * @param argLength
	 *            长度
	 */
	public void setLength(int argLength) {
		this.length = argLength;
	}

	/**
	 * 取得长度
	 *
	 * @return 长度
	 */
	public int getLength() {
		return length;
	}

	/**
	 * 设定协议号
	 *
	 * @param argXieyiHao
	 *            协议号
	 */
	public void setXieyiHao(String argXieyiHao) {
		this.xieyiHao = argXieyiHao;
	}

	/**
	 * 取得协议号
	 *
	 * @return 协议号
	 */
	public String getXieyiHao() {
		return xieyiHao;
	}

	/**
	 * 设定信息内容
	 *
	 * @param argContent
	 *            信息内容
	 */
	public void setContent(String argContent) {
		this.content = argContent;
	}

	/**
	 * 取得信息内容
	 *
	 * @return 信息内容
	 */
	public String getContent() {
		return content;
	}

	/**
	 * 设定信息序列号
	 *
	 * @param argXulieHao
	 *            信息序列号
	 */
	public void setXulieHao(int argXulieHao) {
		this.xulieHao = argXulieHao;
	}

	/**
	 * 取得信息序列号
	 *
	 * @return 信息序列号
	 */
	public int getXulieHao() {
		return xulieHao;
	}

	/**
	 * 设定错误校验
	 *
	 * @param argCrc
	 *            错误校验
	 */
	public void setCrc(String argCrc) {
		this.crc = argCrc;
	}

	/**
	 * 取得错误校验
	 *
	 * @return 错误校验
	 */
	public String getCrc() {
		return crc;
	}

	/**
	 * 带参数的构造函数
	 *
	 * @param input
	 *            GT06协议字符串
	 */
	public GPSBackRequest(String input) {
		parseGt06Info(input);
	}

	/**
	 * 设定结束位
	 *
	 * @param argEnd
	 *            结束位
	 */
	public void setEnd(String argEnd) {
		this.end = argEnd;
	}

	/**
	 * 取得结束位
	 *
	 * @return 结束位
	 */
	public String getEnd() {
		return end;
	}

	/**
	 * 设定原始数据
	 *
	 * @param argOriginalData
	 *            原始数据
	 */
	public void setOriginalData(String argOriginalData) {
		this.originalData = argOriginalData;
	}

	/**
	 * 设定指令流水号
	 *
	 * @param argCmdSerialNo 指令流水号
	 */
	public void setCmdSerialNo(long argCmdSerialNo) {
		this.cmdSerialNo = argCmdSerialNo;
	}

	/**
	 * 取得指令流水号
	 *
	 * @return 指令流水号
	 */
	public long getCmdSerialNo() {
		return cmdSerialNo;
	}

	/**
	 * 取得原始数据
	 *
	 * @return 原始数据
	 */
	public String getOriginalData() {
		return originalData;
	}

	/**
	 * 解析gt06协议的字符串
	 *
	 * @param input
	 */
	private void parseGt06Info(String input) {

		// 保存原始数据
		originalData = input;
		// 信息头(2字节)
		xinxiTou = input.substring(0, 2 * 2);
		input = input.substring(2 * 2);

		// 内容长度(1字节)
		String neiRongChangDu = input.substring(0, 1 * 2);
			length = Integer.parseInt(neiRongChangDu, 16);
		if(length!=0){
			input = input.substring(1 * 2);

			// 协议号(1字节)
			xieyiHao = input.substring(0, 1 * 2);
			input = input.substring(1 * 2);

			// 信息内容(N字节)
			content = input.substring(0, length * 2 - 5 * 2);
			input = input.substring(length * 2 - 5 * 2);

			// 序列号(2字节)
			String xulieHaoI = input.substring(0, 2 * 2);
			xulieHao = Integer.parseInt(xulieHaoI, 16);
			input = input.substring(2 * 2);

			// 错误校验码(2字节)
			crc = input.substring(0, 2 * 2);
			input = input.substring(2 * 2);

			// 结束位(2字节)
			end = input.substring(0, 2 * 2);
		}

	}
}
